<?php
class plgSystemShortcuts extends JPlugin {
 
  function onAfterRender()
  {
	$app =& JFactory::getApplication();
 
	// проверка, что мы не в административной панели
	if ($app->getName()!= 'site') {
	  return true;
	}
	$text = JResponse::getBody();
    $replaces = makeReplacesOnDB ();
    if ($replaces) {
	  $text = strtr ($text, $replaces);
    }
    // Исправляем wiki-ссылки
    $text = processWikiLinks($text);
    JResponse::setBody($text);
	return true;
  }
}

function makeReplacesOnDB () {
  // Формирование массива замен по выборке из БД
  $db =& JFactory::getDBO();
  $sql = "SELECT code as shortcut, url,"
       . "CONCAT(short_title,' ',first_name,' ',last_name) as full_description "
       . "FROM jos_tro_person, jos_tro_titles "
       . "WHERE jos_tro_person.title_code = jos_tro_titles.title_code "
       . "UNION "
       . "SELECT code as shortcut, url, sp_title as full_description "
       . "FROM jos_tro_spectacles "
       . "UNION "
  	   . "SELECT code as shortcut, '' as url, name as full_description FROM jos_tro_places; ";
  
  $db->setQuery($sql);
  $rows = $db->loadObjectList();
  foreach ($rows as $row) {
    $text = $row->full_description;
    if ($row->url != '') $text = "{{" . $row->url . " " . $text . "}}";
    $replaces["\\" . $row->shortcut] = $text;
  }
  return $replaces;
}

function processWikiLinks($text) {
  define('TAGBEGIN',   "\x01");
  define('TAGEND',     "\x02");
  global $shortcuts_Refs, $shortcuts_RefsCntr;
  $shortcuts_RefsCntr = 0;
  $text = preg_replace_callback('/< *a.*?>.*?< *\/a *>/isu', 'shortcuts_putTag', $text);
  // Убираем вики-ссылки внутри <a...> </a>, оставляя только текст ссылки
  for ($i = 1; $i <= $shortcuts_RefsCntr; $i++)
    $shortcuts_Refs[$i] = preg_replace ('/{{([^ ]+) ([^}]+)}}/suim', '\\2', $shortcuts_Refs[$i]);
  while(preg_match('/'.TAGBEGIN.'\d+'.TAGEND.'/u', $text))
	$text = preg_replace_callback('/'.TAGBEGIN.'(\d+)'.TAGEND.'/u', 'shortcuts_getTag', $text);
  // Меняем вики-синтаксис остальных ссылок на обычный html
  $text = preg_replace ('/{{([^ ]+) ([^}]+)}}/suim','<a href="\\1">\\2</a>',$text);
  return $text;
}

function shortcuts_putTag($x)
{
  global $shortcuts_Refs, $shortcuts_RefsCntr;
  $shortcuts_Refs[] = $x[0];
  return TAGBEGIN.($shortcuts_RefsCntr++).TAGEND;
}

function shortcuts_getTag($x)
{
  global $shortcuts_Refs;
  return $shortcuts_Refs[$x[1]];
}
?>